package com.gxa.hualian.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @Author ChenJin
 * @date 2021/10/19 16:40
 * Description:
 **/
@Component
// 切面
//@Aspect
public class LoggerAspect {

    /**
     * 切点:
     * 作用：找到目标方法
     * execution 定义如何找到目标service中的类中的方法
     * 第一个*：表示任意的访问权限
     * 第二个*：表示任意类
     * 第三个*：表示任意方法
     * ..  任意参数情况
     */
    @Pointcut("execution(* com.gxa.hualian.service.impl.*.*(..))")
    public void pointCut(){}

//    /**
//     * 通过JoinPoint增加连接点
//     *
//     * @param joinPoint
//     */
//    @Before("pointCut()")
//    public void before(JoinPoint joinPoint){
//        String name = joinPoint.getSignature().getName();
//        System.out.println("用户执行了方法："+name);
//        System.out.println("参数："+ Arrays.toString(joinPoint.getArgs()));
//        System.out.println("前置通知");
//    }
//
//    @After("pointCut()")
//    public void after(){
//        // finally
//        System.out.println("后置通知");
//    }
//
//    @AfterReturning("pointCut()")
//    public void afterReturning(){
//        // commit
//        System.out.println("后置返回通知");
//    }
//
//    @AfterThrowing("pointCut()")
//    public void afterThrowing(){
//        // 回滚
//        System.out.println("后置抛出通知");
//    }

    @Around("pointCut()")
    public void around(ProceedingJoinPoint proceedingJoinPoint){
        // 把前/后/后置返回/后置抛出继承

        try {
            System.out.println("前置");
            proceedingJoinPoint.proceed();
            System.out.println("后置返回");
        } catch (Throwable throwable) {
            System.out.println("后置抛出");
        }finally {
            System.out.println("后置执行");
        }
    }
}
